#!/usr/bin/python
# -*- coding: utf-8 -*-

import threading,exceptions,Queue
from lib.services import MsImageSearch,GoogleImageSearch
from lib.util import *

class Downloader():
    
    def __init__(self,mission):
        self.lock=threading.Lock()
        self.url,self.file=mission["url"],mission["file"]

    def downAndSave(self):
        """
        下载图片并保存
        """
        url,f=self.url,self.file
        try:
            #转换图片格式
            data=ImageFile.convert(NetIO.read(url))
            f.write(data)
            self.showMessage(u'下载：',f.filename)
        except Exception,e:
            pass
            #self.throwErr(e,url)            
                
    def throwErr(self,e,msg):
        msg={
            urllib2.URLError:u"无法下载："+msg,
            urllib2.HTTPError:u"连接错误："+msg,
            socket.timeout:u"超时错误："+msg,
            exceptions.IOError:u"文件名错误："+msg
        }[e.__class__]
        self.showMessage('\n'+msg+'\n')


    def showMessage(self,*args):
        self.lock.acquire()
        print ''.join(args)
        self.lock.release()

        
class MultiDownloader(threading.Thread):
    
    def __init__(self):
        threading.Thread.__init__(self)
        self.queue=Queue.Queue(16)
        self.start()
        
    def run(self):
        while True:
            miss=self.queue.get()
            if miss is None:
                print "Mission Completed......"
                break
            
            dl=Downloader(miss)
            t = threading.Thread(target=dl.downAndSave)
            t.start()
            
    def append(self,missions):
        for miss in missions:
            self.queue.put(miss)
        
    def stop(self):
        self.queue.put(None)


       
class Mission():
    """
    功能：
        1.根据传入的关键字，从网络获取图片 url 
        2.结合关键字及网络图片文件名生成存储路径
        3.将 url 和 存储路径组合成任务，并放在列表中
    """
    def __init__(self,pair):
        """
        功能：如果文件不存在则直接搜索
        参数：中文、英文两个关键字
        其他：
            1.如果已经存在则返回
            2.生成总存储路径
            3.开始搜索
        """
        self.en,self.zh=pair[0],pair[1]
        self.missions=[]
        # 1
        if self.exists():
            return
        # 2
        File("data\\temp\\%s" % self.en).mkdir()
        #self.path=File("data\\temp\\%s" % self.en)
        #self.path.mkdir()
        # 3
        en,zh=self.en,self.zh.decode("gbk").encode("utf-8")
        self.request(MsImageSearch(zh))
        self.request(MsImageSearch(en))
        self.request(GoogleImageSearch(en))
        self.request(GoogleImageSearch(zh))
        
    def exists(self):
        """
        功能：判断 data\\picture\\ 下对应的图片文件是否已经存在
        """
        home=File("data\\picture\\%s.jpg" % self.en)
        return home.exists()
        
    def target_file(self,url):
        """
        功能：生成图片的存储路径
        其他：
            1.路径：以 apple 为例，data\\temp\\apple\\ 
            2.文件名：data\\temp\\apple\\apple_<url_filename>.jpg
            3.如果同名图片已经存在，则将文件名后加一下划线保存
        """
        f=File("data\\temp\\%s\\%s_%s.jpg" % (self.en,self.en,File.getShortname(url)))
        while f.exists():
            path="%s\\%s_%s" % (f.pathname,f.shortname,f.extname)
            f=File(path)
        return f
 
    def request(self,serv):
        """
        功能：搜索关键字对应的图片，并生成任务
        其他：
            1.任务的格式为：{"file":file_obj,"url":img_url}
            2.每个搜索服务至少要搜索到 10 个结果，因为 Google 图片所搜一次只能返回 4 个图片，
                所以对 Google 图片搜素，至少要搜索 3 次
        """
        li=[]
        while len(li)<10:
            li.extend(serv.request())
        for url in li:
            f=self.target_file(url)
            obj={"file":f,"url":url}
            self.missions.append(obj)
            
        
if __name__=='__main__':
    
    File("data\\temp").mkdir()
        
    dl=MultiDownloader()

    f=open("words.txt","r")
    lines=f.readlines()
    for line in lines:
        pair=line.split()
        en,zh=pair[0],pair[1]
        print "%s\t%s" % (en,zh)
        obj=Mission(pair)
        dl.append(obj.missions)

    dl.stop()    


        